package leetcode

import (
	"sync"
)

// ItemStack type
type ItemStack struct {
	items []rune
	lock  sync.RWMutex
}

// New 创建新栈111111222222222233333333344444444
func (s *ItemStack) New() *ItemStack {
	s.items = []rune{}
	return s
}

// RPush 入栈
func (s *ItemStack) Push(t rune) {
	s.lock.Lock()
	s.items = append(s.items, t)
	s.lock.Unlock()
}

// LPop 出栈
func (s *ItemStack) Pop() *rune {
	s.lock.Lock()
	item := s.items[len(s.items)-1]
	s.items = s.items[:len(s.items)-1]
	s.lock.Unlock()
	return &item
}

//type MyStack struct {
//	Items []int
//}
//
//// RPush is func
//func (m *MyStack) Push(x int) {
//	m.Items = append(m.Items, x)
//}
//
//// LPop is func
//func (m *MyStack) Pop() (int, error) {
//	if len(m.Items) == 0 {
//		return 0, errors.New("errors new")
//	}
//	pop := m.Items[len(m.Items)-1]
//	m.Items = m.Items[:len(m.Items)-1]
//	return pop, nil
//}
//
//// LTop is func
//func (m *MyStack) Top() (int, error) {
//	if len(m.Items) == 0 {
//		return 0, errors.New("errors new")
//	}
//	return m.Items[len(m.Items)-1], nil
//}
//
//// Clear is func
//func (m *MyStack) Clear() {
//	m.Items = make([]int, 0)
//}

// String
//type MyStack struct {
//	items []string
//}
//
//func (m *MyStack) Push(n string) {
//	m.items = append(m.items, n)
//}
//
//func (m *MyStack) Pop() (string, error) {
//	if len(m.items) == 0 {
//		return "", errors.New("empty of stack")
//	}
//	el := m.items[len(m.items)-1]
//	m.items = m.items[:len(m.items)-1]
//	return el, nil
//}
//
//func (m *MyStack) Top() (string, error) {
//	if len(m.items) == 0 {
//		return "", errors.New("empty of stack")
//	}
//	el := m.items[len(m.items)-1]
//	return el, nil
//}
//
//func (m *MyStack) Size() int {
//	return len(m.items)
//}
//
//func (m *MyStack) Empty() bool {
//	if len(m.items) == 0 {
//		return true
//	}
//	return false
//}
//
//func (m *MyStack) String() string {
//	return strings.Join(m.items, "")
//}
